package com.haidong.advice;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.time.LocalTime;

@Component
// aspect切面类注解,也就是装切入点方法的类
@Aspect
public class MyAdvice {
//    * `*`:单个独立的任意符号，可以独立出现，也可以作为前缀或者后缀的匹配符出现
//    execution（public * com.itheima.*.UserService.find*(*))
//    匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

//* `..`：多个连续的任意符号，可以独立出现，常用于简化包名与参数的书写
//    execution（public User com..UserService.findById(..))
//    匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

//* `+`：专用于匹配子类类型
//    execution(* *..*Service+.*(..))
//    这个使用率较低，描述子类的，咱们做JavaEE开发，继承机会就一次，使用都很慎重，所以很少用它。*Service+，表示所有以Service结尾的接口的子类。

    // 定义一个切入点,配合一个空方法
    // 一旦和需要加强的方法匹配成功,就会把那个bean和通知再打包一下成为一个代理bean,然后由这个代理bean来执行增强后的功能
    @Pointcut("execution(void com.haidong.dao.BookDao.update())")
    private void pt(){}

    // 定义切面,就是绑定切入点和通知的关系,当前通知方法会再切入点方法之前执行
    @Before("pt()")
    public void method(){
        System.out.println(LocalTime.now());
    }
}
